package vista;

import ar.uba.fi.algo3.titiritero.vista.TextoDinamico;
import modelo.Jugador;
import modelo.Movil;
import modelo.Nivel;
import modelo.naves.*;
import static modelo.SetUps.*;

/*
 * esta clase sera la encargada de crear las distintas vistas
 * de los moviles, utiliza el patron de disenio 'Factory'. 
 * de este modo logramos desacoplar a los moviles de sus vistas.
 * Esta clase ademas utiliza el patron Singleton pues solo 
 * necesitamos una instancia de la misma.
 */
public class VistaFactory {
	
	private static VistaFactory instance = null;
	
	public static VistaFactory getInstance(){
		if (VistaFactory.instance == null){
			VistaFactory.instance = new VistaFactory();
		}
		return VistaFactory.instance;
	}
	
	public VistaFondo getVistaFondo (){
		VistaFondo vista = new VistaFondo();
		vista.setNombreArchivoImagen(PATH_FONDO);
		return vista;
	}
	
	public VistaGameOver getVistaGameOver (){
		VistaGameOver vista = new VistaGameOver();
		vista.setNombreArchivoImagen(PATH_GAMEOVER);
		return vista;
	}
	
	public VistaMovil getVistaMovil (Movil unMovil, String path){
		VistaMovil vista = new VistaMovil();
		vista.setPosicionable(unMovil);
		vista.setNombreArchivoImagen(path);
		return vista;
	}
	
	public VistaMovilAnimado getVistaMovilAnimado (Movil unMovil){
		VistaMovilAnimado vista = new VistaMovilAnimado();
		vista.setPosicionable(unMovil);
		return vista;
	}
	
	public TextoDinamico getVistaPuntos (Jugador jug){
		TextoDinamico texto = new TextoDinamico(jug.getPuntosObj());
		texto.setColor(COL_TEXTO);
		texto.setFuente(FONT_TEXTO, TAM_TEXTO);
		texto.setPosicionable(POS_PUNTOS);
		return texto;
	}
	
	public TextoDinamico getVistaNivel (Nivel niv){
		TextoDinamico texto = new TextoDinamico(niv);
		texto.setColor(COL_TEXTO);
		texto.setFuente(FONT_TEXTO, TAM_TEXTO);
		texto.setPosicionable(POS_NIVEL);
		return texto;
	}
	
	public TextoDinamico getVistaVidas (Jugador jug){
		TextoDinamico texto = new TextoDinamico(jug.getVidasObj());
		texto.setColor(COL_TEXTO);
		texto.setFuente(FONT_TEXTO, TAM_TEXTO);
		texto.setPosicionable(POS_VIDAS);
		return texto;
	}
	
	public TextoDinamico getVistaMunicion (Jugador jug){
		TextoDinamico texto = new VistaCargaMuniciones(jug);
		texto.setColor(COL_TEXTO);
		texto.setFuente(FONT_TEXTO, TAM_TEXTO);
		texto.setPosicionable(POS_MUNICION);
		return texto;
	}
	
	public TextoDinamico getVistaEnergia (Jugador jug){
		TextoDinamico texto = new VistaEnergia(jug);
		texto.setColor(COL_TEXTO);
		texto.setFuente(FONT_TEXTO, TAM_TEXTO);
		texto.setPosicionable(POS_ENERGIA);
		return texto;
	}

	/*Vistas Varias*/
	//TODO: Arreglar este
	public VistaMovil getVista (Movil movil){
		return this.getVistaMovil((Movil)movil,PATH_CIVIL);
	}
	
	public VistaMovil getVistaAlgo42 (NaveAlgo42 movil){
		return this.getVistaMovil(movil,PATH_ALGO42);
	}
	
	public VistaMovil getVistaAvioneta (Avioneta movil){
		if (((NavesEnemigas)movil).getGuia() == movil) return this.getVistaMovil(movil,PATH_AVIONETA_GUIA);
		else return this.getVistaMovil(movil,PATH_AVIONETA);
	}
	
	public VistaMovil getVistaCaza (Caza movil){
		if (((NavesEnemigas)movil).getGuia() == movil) return this.getVistaMovil(movil,PATH_CAZA_GUIA);
		return this.getVistaMovil(movil,PATH_CAZA);
	}
	
	public VistaMovil getVistaCazaEspecial (CazaEspecial movil){
		if (((NavesEnemigas)movil).getGuia() == movil) return this.getVistaMovil(movil,PATH_CAZA_ESPECIAL_GUIA);
		return this.getVistaMovil(movil,PATH_CAZA_ESPECIAL);
	}
	
	public VistaMovil getVistaBombardero (Bombardero movil){
		if (((NavesEnemigas)movil).getGuia() == movil) return this.getVistaMovil(movil,PATH_BOMBARDERO_GUIA);
		return this.getVistaMovil(movil,PATH_BOMBARDERO);
	}
	
	public VistaMovil getVistaExplorador (Explorador movil){
		if (((NavesEnemigas)movil).getGuia() == movil) return this.getVistaMovil(movil,PATH_EXPLORADOR_GUIA);
		return this.getVistaMovil(movil,PATH_EXPLORADOR);
	}	
	
	public VistaMovil getVistaCivil (Civil movil){
		return this.getVistaMovil(movil,PATH_CIVIL);
	}
	
	public VistaMovilAnimado getVistaPolicia (Policia movil){
		VistaMovilAnimado vista = this.getVistaMovilAnimado(movil);
		vista.addFrame(PATH_HELICOPTERO1);
		vista.addFrame(PATH_HELICOPTERO2);
		vista.addFrame(PATH_HELICOPTERO3);
		return vista;
	}

	public VistaMovil getVistaLaser(Movil movil) {
		return this.getVistaMovil (movil,PATH_LASER);
	}

	public VistaMovil getVistaCohete(Movil movil) {
		return this.getVistaMovil (movil,PATH_COHETE);
	}

	public VistaMovil getVistaTorpedoSimple(Movil movil) {
		return this.getVistaMovil (movil, PATH_TORPEDO_SIMPLE);
	}

	public VistaMovil getVistaTorpedoRastreador(Movil movil) {
		return this.getVistaMovil (movil, PATH_TORPEDO_RASTREADOR);
	}
	
	public VistaMovil getVistaRadar (Movil movil){
		return this.getVistaMovil (movil, PATH_RADAR);
	}

	public VistaMovil getVistaPickUpEnergia(Movil movil) {
		return this.getVistaMovil(movil, PATH_PICKUP_H);
	}
	
	public VistaMovil getVistaPickUpArma (Movil movil){
		return this.getVistaMovil (movil, PATH_PICKUP_M);
	}
		
}
